package tp.tecnicasdisenio.model.validador;

import java.io.File;
import java.util.List;

import tp.tecnicasdisenio.dao.GrupoDaoInterface;
import tp.tecnicasdisenio.dao.MateriaDaoInterface;
import tp.tecnicasdisenio.model.AutoRespondedorInterface;
import tp.tecnicasdisenio.model.MailInterface;
import tp.tecnicasdisenio.model.entity.Alumno;
import tp.tecnicasdisenio.model.entity.Grupo;
import tp.tecnicasdisenio.model.entity.Materia;
import tp.tecnicasdisenio.model.parser.ParserAdjuntoAltaGrupo;
import tp.tecnicasdisenio.util.FechaUtil;

public class ValidadorAltaGrupo extends ValidadorAbstract{

	private MateriaDaoInterface materiaDao;
	private GrupoDaoInterface grupoDao;
	private ParserAdjuntoAltaGrupo parserAdjuntoAltaGrupo ; 

	/**
	 * -Valida que el alumno que envia el mail exista
	 * -Valida que cada padron que forma parte del grupo no este inscripto 
	 * en otro grupo. Los padrones deben estar en un archivo de texto con un
	 * padron por linea.
	 * -Valida que cada padron corresponda a un inscrito en el
	 * cuatrimestre actual
	 */
	@Override
	public boolean valido(MailInterface mail, AutoRespondedorInterface autoRespondedor) {
		Alumno alumno= alumnoDao.getPorEmail(mail.getFrom());
		if(!existe(alumno)){
			autoRespondedor.responderA(mail, "Mail inválido, alumno inexistente.");
			System.out.println("Mail inválido, alumno inexistente. Se responde mail.");
			return false;
		}

		List<File> adjuntos= mail.getAdjuntos();
		if(adjuntos.isEmpty()){
			autoRespondedor.responderA(mail, "Mail inválido, no hay adjunto.");
			System.out.println("Mail inválido, no hay adjunto. Se responde mail.");
			return false;
		}

		if(!grupoValido(mail)){
			autoRespondedor.responderA(mail, "Mail inválido, grupo invalido.");
			System.out.println("Mail inválido, grupo invalido. Se responde mail.");
			return false;
		}

		return true;
	}
	
	/*
	 * cada alumno debe estar inscripto en la materia y no debe estar 
	 * inscripto en otro grupo
	 */
	private boolean grupoValido(MailInterface mail){
		try{	
			String emailMateria= mail.getTo().get(0);
			Materia materia= materiaDao.getPorEmail(emailMateria);
			for(String padron : parserAdjuntoAltaGrupo.padrones(mail)){
				if(!inscripto(padron, emailMateria) || inscriptoEnOtroGrupo(padron, materia)){
					return false;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} 
		return true;
	}

	private boolean inscriptoEnOtroGrupo(String padron, Materia materia) {
		Alumno alumno= alumnoDao.getPorId(padron);
		Grupo grupo= grupoDao.getGrupoDel(alumno, materia, FechaUtil.getCuatrimestreActual());
		return grupo != null;
	}

	private boolean inscripto(String padron, String emailMateria) {
		return alumnoDao.estaInscriptoEnMateria(padron, emailMateria, FechaUtil.getCuatrimestreActual());
	}

	public GrupoDaoInterface getGrupoDao() {
		return grupoDao;
	}

	public void setGrupoDao(GrupoDaoInterface grupoDao) {
		this.grupoDao = grupoDao;
	}

	public MateriaDaoInterface getMateriaDao() {
		return materiaDao;
	}

	public void setMateriaDao(MateriaDaoInterface materiaDao) {
		this.materiaDao = materiaDao;
	}

	public ParserAdjuntoAltaGrupo getParserAdjuntoAltaGrupo() {
		return parserAdjuntoAltaGrupo;
	}

	public void setParserAdjuntoAltaGrupo(
			ParserAdjuntoAltaGrupo parserAdjuntoAltaGrupo) {
		this.parserAdjuntoAltaGrupo = parserAdjuntoAltaGrupo;
	}
	

}